import io from 'socket.io-client'

class SocketService {
  constructor() {
    // 初始化 Socket.IO 客户端 38.246.253.109
    this.socket = io('http://38.246.253.109:5000', {
      transports: ['websocket'], // 优先使用 WebSocket
      reconnection: true, // 启用自动重连
      reconnectionAttempts: Infinity, // 无限制重试
      reconnectionDelay: 1000, // 重连间隔 1 秒
      reconnectionDelayMax: 5000, // 最大重连间隔 5 秒
      timeout: 20000 // 连接超时 20 秒
    })

    // 监听连接成功事件
    this.socket.on('connect', () => {
      console.log('Socket.IO 连接成功，ID:', this.socket.id)
    })

    // 监听连接错误
    this.socket.on('connect_error', (err) => {
      console.error('Socket.IO 连接错误:', err.message)
    })

    // 监听普通错误
    this.socket.on('error', (err) => {
      console.error('Socket.IO 错误:', err)
    })

    // 监听断开连接
    this.socket.on('disconnect', (reason) => {
      console.log('Socket.IO 断开连接，原因:', reason)
    })
  }

  // 检查并等待连接成功，返回 Promise
  async isConnected(maxAttempts = 5, delay = 2000) {
    if (!this.socket) {
      throw new Error('Socket 未初始化')
    }

    // 如果已经连接，直接返回
    if (this.socket.connected) {
      return true
    }

    // 重试逻辑
    for (let attempt = 1; attempt <= maxAttempts; attempt++) {
      try {
        console.log(`尝试连接 Socket.IO (第 ${attempt}/${maxAttempts} 次)`)
        await new Promise((resolve, reject) => {
          this.socket.once('connect', () => resolve(true))
          this.socket.once('connect_error', (err) => reject(new Error(`连接失败: ${err.message}`)))
          setTimeout(() => reject(new Error('连接超时')), 5000) // 单次尝试超时 5 秒
          this.socket.connect() // 手动触发连接（如果已断开）
        })
        return true // 连接成功
      } catch (error) {
        console.warn(`连接失败 (第 ${attempt}/${maxAttempts} 次):`, error.message)
        if (attempt === maxAttempts) {
          throw new Error('达到最大重试次数，Socket.IO 连接失败')
        }
        await new Promise((resolve) => setTimeout(resolve, delay)) // 等待后重试
      }
    }
  }

  // 监听事件
  on(event, callback) {
    if (!this.socket) {
      console.warn('Socket 未初始化，无法监听事件:', event)
      return this
    }
    this.socket.on(event, callback)
    return this // 支持链式调用
  }

  // 移除事件监听
  off(event, callback) {
    if (!this.socket) {
      console.warn('Socket 未初始化，无法移除事件:', event)
      return this
    }
    this.socket.off(event, callback)
    return this // 支持链式调用
  }

  // 发送事件
  emit(event, data) {
    if (!this.socket) {
      console.warn('Socket 未初始化，无法发送事件:', event)
      return this
    }
    this.socket.emit(event, data)
    return this // 支持链式调用
  }

  // 检查当前连接状态（同步方法）
  getConnectionStatus() {
    return this.socket && this.socket.connected
  }

  // 手动断开连接
  disconnect() {
    if (!this.socket) {
      console.warn('Socket 未初始化，无需断开')
      return
    }
    this.socket.disconnect()
    console.log('Socket.IO 已手动断开')
  }

  // 手动重连（可选）
  reconnect() {
    if (!this.socket) {
      console.warn('Socket 未初始化，无法重连')
      return
    }
    if (!this.socket.connected) {
      this.socket.connect()
      console.log('Socket.IO 正在尝试重连...')
    }
  }
}

export default new SocketService()
